home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / sql_injection.nasl < prev    next >
Text File  |  2005-03-31  |  7KB  |  271 lines

  1. #
  2. # This script was written by John Lampe ... j_lampe@bellsouth.net
  3. #
  4. # Script is based on wpoison by M.Meadele mm@bzero.net
  5. # See http://wpoison.sourceforge.net
  6. #
  7. # See the Nessus Scripts License for details
  8. #
  9. #
  10. # re-worked Aug 20, 2004 : jwlampe -at- tenablesecurity.com adds POST checks 
  11. #
  12.  
  13.  
  14.  
  15. if(description)
  16. {
  17.  script_id(11139);
  18. #script_cve_id("CVE-MAP-NOMATCH");
  19.  script_version ("$Revision: 1.22 $");
  20.  name["english"] = "wpoison (nasl version)";
  21.  script_name(english:name["english"]);
  22.  
  23.  desc["english"] = "
  24. This script attempts to use SQL injection techniques on CGI scripts
  25. More info at : http://www.securiteam.com/securityreviews/5DP0N1P76E.html
  26.  
  27.  
  28. Solution : Modify the relevant CGIs so that they properly escape arguments.
  29.  
  30. Risk factor : High";
  31.  
  32.  
  33.  
  34.  script_description(english:desc["english"]);
  35.  
  36.  summary["english"] = "Some common SQL injection techniques";
  37.  
  38.  script_summary(english:summary["english"]);
  39.  
  40.  script_category(ACT_GATHER_INFO);
  41.  
  42.  
  43.  script_copyright(english:"This script is Copyright (C) 2002 John Lampe...j_lampe@bellsouth.net");
  44.  family["english"] = "CGI abuses";
  45.  family["francais"] = "Abus de CGI";
  46.  script_family(english:family["english"], francais:family["francais"]);
  47.  script_dependencie("find_service.nes", "webmirror.nasl");
  48.  script_require_ports("Services/www", 80);
  49.  exit(0);
  50. }
  51.  
  52. #
  53. # The script code starts here
  54. #
  55.  
  56. include("http_func.inc");
  57. include("http_keepalive.inc");
  58.  
  59. single_quote = raw_string(0x27);
  60.  
  61. poison[0] = single_quote + "UNION" + single_quote;
  62. poison[1] = single_quote;
  63. poison[2] = single_quote + "%22";
  64. poison[3] = "9%2c+9%2c+9";
  65. poison[4] = single_quote + "bad_bad_value";
  66. poison[5] = "bad_bad_value" + single_quote;
  67. poison[6] = single_quote + "+OR+" + single_quote;
  68. poison[7] = single_quote + "WHERE";
  69. poison[8] = "%3B"; # semicolon
  70. poison[9] = single_quote + "OR";
  71. # methods below from http://www.securiteam.com/securityreviews/5DP0N1P76E.html
  72. poison[10] = single_quote + " or 1=1--";
  73. poison[11] = " or 1=1--";
  74. poison[12] = single_quote + " or " + single_quote + "a" + single_quote + "=" + single_quote + "a";
  75. poison[13] = single_quote + ") or (" + single_quote + "a" + single_quote + "=" + single_quote + "a";
  76.  
  77.  
  78. posreply[0] = "Can't find record in";
  79. posreply[1] = "Column count doesn't match value count at row";
  80. posreply[2] = "error " + single_quote;
  81. posreply[3] = "Incorrect column name";
  82. posreply[4] = "Incorrect column specifier for column";
  83. posreply[5] = "Invalid parameter type";
  84. posreply[6] = "Microsoft OLE DB Provider for ODBC Drivers error";
  85. posreply[7] = "ODBC Microsoft Access Driver";
  86. posreply[8] = "ODBC SQL Server Driver";
  87. posreply[9] = "supplied argument is not a valid MySQL result";
  88. posreply[10] = "Table ";
  89. posreply[11] = "Unknown table";
  90. posreply[12] = "You have an error in your SQL syntax";
  91. posreply[13] = "Microsoft VBScript runtime";
  92. posreply[14] = "Syntax";
  93. posreply[15] = "not a valid MySQL result resource";
  94. posreply[16] = "unexpected end of SQL command";
  95. posreply[17] = "mySQL error with query";
  96. posreply[18] = "ORA-00936: missing expression";
  97. posreply[19] = "ORA-00933: SQL command not properly ended";
  98. posreply[20] = "Unclosed quotation mark before the character string";
  99. posreply[21] = "Incorrect syntax near";
  100. posreply[22] = "PostgreSQL query failed:";
  101. posreply[23] = "not a valid PostgreSQL result";
  102. posreply[24] = "An illegal character has been found in the statement";
  103. posreply[25] = "[IBM][CLI Driver][DB2/6000]";
  104. posreply[26] = "Unable to connect to PostgreSQL server:";
  105. posreply[27] = "Can't connect to local";
  106. posreply[28] = "Error Occurred While Processing Request";
  107. posreply[29] = "mysql_query()";
  108.  
  109. port = get_http_port(default:80);
  110.  
  111. if(! get_port_state(port))
  112.     exit(0);
  113. unsafe_urls = "";
  114. mywarningcount = 0;
  115.  
  116.  
  117. name = string("www/", port, "/cgis");
  118. cgi = get_kb_item(name);
  119. if(! cgi)
  120.     exit(0);
  121.  
  122. # populate two arrays param[] and data[]  
  123. everythingrray = split(cgi, sep:" ", keep:FALSE);    
  124.  
  125. if (everythingrray[0] =~ ".*/$")
  126. {
  127.     isdir = 1;
  128. }
  129. else
  130. {
  131.     isdir = 0;
  132. }
  133.  
  134. if (! isdir)
  135. {
  136.     pseudocount = 0;
  137.     foreach rrayval (everythingrray)
  138.     {
  139.         if (pseudocount >= 2)
  140.         {
  141.             if ("]" >< rrayval)
  142.             {
  143.                 tmpf = ereg_replace(pattern:"\[|\]", string:rrayval, replace:"");
  144.                 data[pseudocount] = tmpf;
  145.                 
  146.             }
  147.             else
  148.             {
  149.                 param[pseudocount] = rrayval;
  150.             }
  151.         }    
  152.         else
  153.         {
  154.             param[pseudocount] = rrayval;
  155.         }
  156.         pseudocount++;
  157.     }
  158. }
  159.  
  160.  
  161.  
  162. for (z=2; param[z]; z = z + 1) 
  163. {
  164.     url = param[z];
  165.     req = http_get(item:url, port:port);
  166.         res = http_keepalive_send_recv(port:port, data:req);
  167.         if ( res == NULL ) 
  168.         exit(0);
  169.         for ( i = 0; posreply[i]; i ++ )
  170.         {
  171.              if ( posreply[i] >< res ) 
  172.         {
  173.             exit(0); # Broken SQL
  174.             #display("broken sql\n");              #remov 
  175.         }
  176.         }
  177.           for (poo=0; poison[poo]; poo = poo + 1) 
  178.     {
  179.             url = string(param[0],"?");
  180.             for (i=2 ; param[i]; i = i + 1) 
  181.         {
  182.                   if (i == z) 
  183.             {
  184.                       if (data[i]) 
  185.                 {
  186.                         url = string(url,param[i],"=",poison[poo]);
  187.                       } 
  188.                 else 
  189.                 {
  190.                               url = string(url,param[i],"=",poison[poo]);
  191.                       }
  192.                   } 
  193.             else 
  194.             {
  195.                       if (data[i]) 
  196.                 {
  197.                               url = string(url,param[i],"=",data[i]);
  198.                       } 
  199.                 else 
  200.                 {
  201.                               url = string(url,param[i],"=");
  202.                       }
  203.                   }
  204.                   if (param[i + 1]) 
  205.             {
  206.                 url = string(url,"&");
  207.             }
  208.             }
  209.         
  210.         
  211.         req = http_get(item:url, port:port);
  212.  
  213.         inbuff = http_keepalive_send_recv(port:port, data:req);
  214.         if( inbuff == NULL ) 
  215.             exit(0);
  216.             for (mu=0; posreply[mu]; mu = mu + 1) 
  217.         {
  218.                     if (posreply[mu] >< inbuff ) 
  219.             {
  220.                       unsafe_urls = string(unsafe_urls, url, "\n");
  221.                       mywarningcount = mywarningcount + 1;
  222.                   }
  223.             }
  224.  
  225.  
  226.         if ( safe_checks() == 0 )
  227.         {
  228.                 # create a POST req  
  229.                 tmppost = split(url, sep:"?", keep:FALSE);
  230.                 mypostdata = tmppost[1];
  231.                 postreq = http_post(item:param[0], port:port, data:mypostdata);
  232.  
  233.  
  234.         # Test the POST req
  235.         inbuff = http_keepalive_send_recv(port:port, data:postreq);
  236.         if ( inbuff == NULL )
  237.             exit(0);
  238.                 for (mu=0; posreply[mu]; mu = mu + 1)
  239.                  {
  240.                         if (posreply[mu] >< buff )
  241.                         {
  242.                                 unsafe_urls = string(unsafe_urls, url, "\n");
  243.                                 mywarningcount = mywarningcount + 1;
  244.                         }
  245.                  }
  246.         }
  247.  
  248.           }
  249. }            
  250.  
  251.  
  252. if (mywarningcount > 0) 
  253. {
  254.         report = string("
  255. The following URLs seem to be vulnerable to various SQL injection
  256. techniques : \n\n", 
  257.         unsafe_urls,
  258.         "\n\n
  259. An attacker may exploit this flaws to bypass authentication
  260. or to take the control of the remote database.
  261.  
  262.  
  263. Solution : Modify the relevant CGIs so that they properly escape arguments
  264. Risk factor : High
  265. See also : http://www.securiteam.com/securityreviews/5DP0N1P76E.html");
  266.  
  267.         
  268.         security_hole(port:port, data:report);
  269. }
  270.  
  271.